import pymysql


class DBUtil:
    # 创建类属性，连接、游标
    __conn = None
    __cursor = None

    # 创建连接
    @classmethod
    def __get_conn(cls):
        host = "211.103.136.244"
        port = 7061
        user = "student"
        pw = "iHRM_student_2021"
        db = "ihrm"
        chs = "utf8"
        # 连接创建好后，赋值给类属性，这时候其他的类方法就可以直接使用 连接 这个类属性了
        cls.__conn = pymysql.connect(host=host, port=port, user=user, password=pw, database=db, charset=chs)

    # 创建游标
    @classmethod
    def __get_cursor(cls):
        # 调用上面做好的创建连接的工具
        cls.__get_conn()
        # 通过连接这个类属性，创建游标，并赋值给游标类属性
        cls.__cursor = cls.__conn.cursor()

    # 关闭游标
    @classmethod
    def __close_cursor(cls):
        cls.__cursor.close()

    # 关闭连接
    @classmethod
    def __close_conn(cls):
        cls.__conn.close()

    # 执行sql语句
    @classmethod
    def sql_execute(cls, sql):
        # 调用我们上面做好的工具-创建游标
        cls.__get_cursor()

        try:
            # 执行接收到的sql语句
            cls.__cursor.execute(sql)
            # 判断是否为查询语句，如果是，则
            if sql.split()[0].lower() == "select":
                res = cls.__cursor.fetchall()
                print("查询语句的结果集===", res)
                return res

            # 如果不是查询语句，而是增删改语句，则
            else:
                # 进行事务的提交
                cls.__conn.commit()
                print("执行增删改语句后返回受影响的行数===", cls.__conn.affected_rows())
                return cls.__conn.affected_rows()
        except Exception as e:
            print("数据库操作异常Error===", e)
            # 如果是增删改语句
            if sql.split()[0].lower() != "select":
                # 就要进行事务的回滚
                print("执行增删改语句发生异常，进行事务回滚")
                cls.__conn.rollback()
        finally:
            # 调用我们做好的工具，关闭游标
            cls.__close_cursor()

            # 调用我们做好的工具，关闭连接
            cls.__close_conn()
